//给定两个单词 word1 和
// word2 ，返回使得
// word1 和
// word2 相同所需的最小步数。
//
// 每步 可以删除任意一个字符串中的一个字符。
//
//
//
// 示例 1：
//
//
//输入: word1 = "sea", word2 = "eat"
//输出: 2
//解释: 第一步将 "sea" 变为 "ea" ，第二步将 "eat "变为 "ea"
//
//
// 示例 2:
//
//
//输入：word1 = "leetcode", word2 = "etco"
//输出：4
//
//
//
//
// 提示：
//
//
//
// 1 <= word1.length, word2.length <= 500
// word1 和 word2 只包含小写英文字母
//
//
// Related Topics 字符串 动态规划 👍 567 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
function minDistance(word1: string, word2: string): number {

    /*
    1.确定dp数组（dp table）以及下标的含义
    dp[i][j]：以i-1为结尾的字符串word1，和以j-1位结尾的字符串word2，想要达到相等，所需要删除元素的最少次数。
    2.递推公式
    当word1[i - 1] 与 word2[j - 1]相同的时候
        dp[i - 1][j - 1]
    当word1[i - 1] 与 word2[j - 1]不相同的时候 有三种情况：
        删除word[i - 1]：dp[i - 1][j] + 1
        删除word[j - 1]：dp[i][j - 1] + 1
        删除word[i - 1] 和 word[j - 1]：dp[i - 1][j - 1] + 2
    因为 dp[i][j - 1] + 1 = dp[i - 1][j - 1] + 2，
    所以递推公式可简化为：dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);
    当同时删word1[i - 1]和word2[j - 1]，dp[i][j-1] 本来就不包含 word2[j - 1]了，
    那么我再删 word1[i - 1]，就达到两个元素都删除的效果，即 dp[i][j-1] + 1
    3.dp数组如何初始化
    从递推公式中，可以看出来，dp[i][0] 和 dp[0][j]是一定要初始化的。
    dp[i][0]：word2为空字符串，以i-1为结尾的字符串word1要删除多少个元素，才能和word2相同呢，很明显dp[i][0] = i。
     */


    /**
     * 用两个字符串的总长度减去两个最长公共子序列的长度就是删除的最少步数 *
     dp[i][j]: word1前i个字符，word2前j个字符，最长公共子序列的长度
     dp[0][0]=0: word1前0个字符为'', word2前0个字符为''
     */
    const length1: number = word1.length,
        length2: number = word2.length;
    const dp: number[][] = new Array(length1 + 1).fill(0)
        .map(_ => new Array(length2 + 1).fill(0));
    for (let i = 1; i <= length1; i++) {
        for (let j = 1; j <= length2; j++) {
            if (word1[i - 1] === word2[j - 1]) {
                dp[i][j] = dp[i - 1][j - 1] + 1;
            } else {
                dp[i][j] = Math.max(dp[i][j - 1], dp[i - 1][j]);
            }
        }
    }
    const maxLen: number = dp[length1][length2];
    return length1 + length2 - maxLen * 2;
};
//leetcode submit region end(Prohibit modification and deletion)
